package com.gyj.Test.Baseknowledge;

/**
 * static
 * 一.静态成员变量
 1.属于整个类而不是某个对象实例，所以可以直接通过类名和对象名去调用。
 2.静态成员属于整个类，当系统第一次使用该类时，就会为其分配内存空间直到该类被卸载才会进行资源回收

 二.静态方法
 1.静态方法中可以直接调用同类中的静态成员，但不能直接调用非静态成员；如果希望在静态方法中调用非静态变量，可以通过创建类的对象，然后通过对象来访问非静态变量
 2. 在普通成员方法中，则可以直接访问同类的非静态变量和静态变量
 3. 静态方法中不能直接调用非静态方法，需要通过对象来访问非静态方法
 注：静态方法是属于类的，内存必须为它分配内存空间，这个空间一直由静态方法占用，内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回，
 这样如果将所有的方法都声明为静态方法，就会占用大量的内存空间，最后是系统变慢。而普通的成员方法是由对象调用的，内存并不会一直为起分配内存，只有调用
 的时候才为其分配存储空间，而当其没有被调用时，存储空间就会被内存管理其收回，释放没有用的空间，提高的系统的运行速率

 三.初始化块和静态初始化块
 1.为什么要有初始化？
 　答：初始化块就是构造器的补充，初始化块是不能接收任何参数的，定义的一些所有对象共有的属性、方法等内容时就可以用初始化块初始化了好处是可以提高初始化块的复用，提高整个应用的可维护性
 2.有初始化块和静态初始化块的区别？
 　答：（1）程序运行时静态初始化块最先被执行，然后执行普通初始化块，最后才执行构造方法。
 　　　（2）静态初始化块只在类加载时执行一次，且只能初始化静态成员变量，不能初始化普通变量
 * Created by Gao on 2018/4/10.
 */
public class StaticTest {

    String name;
    String sex;
    static int age;

    public StaticTest() {
        System.out.println("通过构造方法初始化name");
        name = "Tom";
    }

    //初始化
    {
        sex = "男";
        System.out.println("通过初始化块初始化sex");
    }

    //静态初始化块，只在类加载的时候初始化一次，且只能初始化静态成员变量，不能初始化普通变量
    static {
        age = 20;
        System.out.println("通过静态初始化块初始化age");
    }

    public void show() {
        System.out.println("姓名：" + name + "，性别：" + sex + "，年龄：" + age);
    }

    public static void main(String[] args) {

        StaticTest test = new StaticTest();

        test.show();

        StaticTest test1 = new StaticTest();
    }
}

/**
 * 通过静态初始化块初始化age
   通过初始化块初始化sex
   通过构造方法初始化name
   姓名：Tom，性别：男，年龄：20
   通过初始化块初始化sex
   通过构造方法初始化name
 ******************************************************************************************
 */


